// pages/goods/qkd.js
import {
  baseUrl
} from '../../../config'
import pay from '../../../model/pay'
import order from '../../../model/order'
import product from '../../../model/product'
import userAddr from '../../../model/userAddr'
import {
  afterMinute,
  afterDay,
  formatDate
} from '../../../utils/util'
import userCoupon from '../../../model/userCoupon'

let msg
Page({

  data: {
    id: '',
    detail: {},
    spec: {},
    productAttachList: [],
    //日期选择器
    startDate: '',
    endDate: '',
    startTime: '',
    //---------表单开始-------------
    isChecked: false,
    //标识，0：正常订单，1：加急订单
    tag: 0,
    //附加文件（取件截图)
    attachFileList: [],
    //附件说明
    attachText: '',
    // 是否跨区，1：是、0：否
    isCrossRegion: 0,
    //收货地址
    addrId: '',
    //备注
    remark: '',
    //预约时间
    aptTime: '',
    //入户密码
    intoPwd: '',
    //交接方式，1：有人在家，敲门、2：无人在家，放门口、3：入户密码、4：预约时间、0：其他
    delvMode: '',
    //----------------表单结束------------
    //------------加载数据-----------
    //商品详情
    //下单返回结果
    order: {},
    //商品列表
    products: [],
    //用户地址列表
    uAddrs: [],
    //订单确认弹窗
    payDisplay: false,
    //------------加载数据结束-----------
    itemNum: 0, //默认快递数量
    uploadUrl: baseUrl + '/file/upload',

    //消费券
    userCouponList: [],
    //选中的优惠券id
    userCouponId: '',
    //是否展示消费券列表
    couponOpen: false,
    // 配送方式列表
    ways: [{
        id: 1,
        title: '有人在家，敲门',
        value: ''
      },
      {
        id: 2,
        title: '无人在家，放门口',
        value: ''
      },
      {
        id: 3,
        title: '入户密码',
        value: ''
      },
      {
        id: 4,
        title: '预约时间',
        value: ''
      }
    ],

    date: '',
    time: '',
    background: 'rgba(0,0,0,.6)',
    backgroud_success: 'rgba(76, 175, 80, 0.6)',
    backgroud_error: 'rgba(244, 67, 54, 0.6)',
    backgroud_warn: 'rgba(255, 152, 0, 0.6)',
    backgroud_tips: 'rgba(33, 150, 243, 0.6)',

    //mp-uploader
    fileList: []

  },

  // 图片上传
  afterRead(event) {
    const _this = this;
    const files = event.detail.file;
    let {
      fileList = []
    } = this.data;
    let currentIndex = 0;

    wx.showLoading({
      title: '上传中...',
    });

    function uploadNext() {
      if (currentIndex < files.length) {
        const file = files[currentIndex];
        wx.uploadFile({
          url: _this.data.uploadUrl,
          name: 'file',
          filePath: file.url,
          success(res) {
            if (res.errMsg !== 'uploadFile:ok') {
              wx.hideLoading();
              msg && msg.show({
                text: '上传失败，图片异常'
              });
              return;
            }
            let result = JSON.parse(res.data);
            if (result.code != 200 || result.data.length === 0) {
              wx.hideLoading();
              msg && msg.show({
                text: result.msg
              });
              return;
            }

            fileList.push({
              url: result.data.url
            });
            _this.setData({
              fileList: fileList
            });

            currentIndex++;
            uploadNext(); // 继续上传下一张图片
          },
          complete() {
            if (currentIndex === files.length) {
              wx.hideLoading(); // 所有图片上传完成后隐藏加载提示
              msg && msg.show({
                text: '上传成功'
              });
            }
          }
        });
      }
    }

    uploadNext(); // 开始上传第一张图片
  },

  //删除图片
  deleteImg(e) {
    let fileList = this.data.fileList
    const index = e.detail.index
    fileList.splice(index, 1);
    this.setData({
      fileList: fileList
    })
  },
  /**
   * 是否跨区
   * @param {*} e 
   */
  switch (e) {
    let val = e.detail.value
    let attach = e.currentTarget.dataset.attach
    let productAttachList = this.data.productAttachList

    // 判断是否已经存在于列表中
    let existingIndex = productAttachList.findIndex(item => item.id === attach.id)

    if (val && existingIndex === -1) {
      // 如果是true且不存在于列表中，则添加到productAttachList中
      productAttachList.push(attach)
    } else if (!val && existingIndex !== -1) {
      // 如果是false且存在于列表中，则从productAttachList中删除
      productAttachList.splice(existingIndex, 1)
    }
  },

  /**
   * 消费券勾选
   * @param {*} e 
   */
  couponRadio(e) {
    let userCouponId = e.detail.value
    this.setData({
      userCouponId: userCouponId
    })
  },
  /**
   * 是否使用优惠券
   * @param {*} e 
   */
  couponSwitch(e) {
    let val = e.detail.value
    if (val) {
      this.setData({
        userCouponId: '',
        couponOpen: val
      })
    } else {
      this.setData({
        userCouponId: '',
        couponOpen: val
      })
    }

  },

  /**
   * 获取用户的消费券列表
   */
  getUserCouponList() {
    userCoupon.list({}, res => {
      if (res.code == 200) {
        this.setData({
          userCouponList: res.data
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    })
  },

  //入户密码输入
  pwdInput(e) {
    let inputValue = e.detail.value;
    this.setData({
      intoPwd: inputValue
    })
  },
  //备注输入
  inputChange(e) {
    let inputValue = e.detail.value;
    this.setData({
      attachText: inputValue
    })
  },

  add() { // 跳转新增地址
    wx.navigateTo({
      url: '/pages/me/address/addedit/addedit',
    })
  },

  bindDateChange: function (e) { //日期选择
    console.log('picker发送选择改变，携带值为', e.detail.value)
    this.setData({
      date: e.detail.value
    })
  },
  bindTimeChange: function (e) { //时间选择
    console.log('picker发送选择改变，携带值为', e.detail.value)
    this.setData({
      time: e.detail.value
    })
  },
  //下单
  place() {
    let aptTime = ''
    let intoPwd = ''
    let delvMode = this.data.delvMode
    if (delvMode == 3) {
      intoPwd = this.data.intoPwd
    }

    if (delvMode == 4) {
      aptTime = this.data.date + ' ' + this.data.time
    }
    //这里固定一个商品，数量为1
    const items = []
    items.push({
      id: this.data.detail.id,
      specId: this.data.spec.id,
      num: this.data.itemNum
    })
    //附加服务
    let productAttachList = this.data.productAttachList
    const imgList = this.data.fileList.map(item => item.url)
    const data = {
      items: items, //商品列表
      productAttachList: productAttachList, //附加服务列表
      delvMode: this.data.delvMode, //配送方式
      intoPwd: intoPwd, //设置入户密码
      aptTime: aptTime, //预约时间
      tag: this.data.tag, //是否加急配送
      attachFileList: imgList, //图片文件
      attachText: this.data.attachText, //附加说明
      addrId: this.data.addrId, //地址
      remark: this.data.remark, //备注
    }
    //如果勾选了优惠券，则使用优惠券
    if (this.data.couponOpen && this.data.userCouponId) {
      data.userCouponId = this.data.userCouponId
    }

    //参数校验
    if (!data.delvMode) {
      wx.showToast({
        title: '请选中配送方式',
        icon: 'none'
      })
      return
    }
    if (data.delvMode == 3 && !data.intoPwd) {
      wx.showToast({
        title: '请填写入户密码',
        icon: 'none'
      })
      return
    }
    if (data.delvMode == 4 && !data.aptTime) {
      wx.showToast({
        title: '请选中预约时间',
        icon: 'none'
      })
      return
    }
    if (!data.addrId) {
      wx.showToast({
        title: '请选择送达地址',
        icon: 'none'
      })
      return
    }
    if (!data.items[0].num) {
      wx.showToast({
        title: '请填写取件数量',
        icon: 'none'
      })
      return
    }

    order.pickPlace(data, res => {
      if (res.code == 200) {
        this.setData({
          order: res.data,
          payDisplay: true
        })
      } else {
        this.setData({
          backgroud: 'rgba(33, 150, 243, 0.6)'
        })
        msg && msg.show({
          text: res.msg
        })
      }
    })
  },

  pay() {
    let that = this
    let reqData = {
      id: this.data.order.id
    }
    pay.prePay(reqData, (res => {
      if (res.code === 200) {
        let type = 1
        const reqPay = res.data
        wx.requestPayment({
          "timeStamp": reqPay.timeStamp,
          "nonceStr": reqPay.nonceStr,
          "package": reqPay.package,
          "signType": "RSA",
          "paySign": reqPay.paySign,
          "success": function (res) {
            type = 1
            wx.showToast({
              title: '支付成功',
            })
          },
          "fail": function (res) {
            type = 2
            console.log('支付失败:', res)
          },
          "complete": function (res) {
            //关闭支付窗口
            that.setData({
              payDisplay: false
            })

            wx.navigateTo({
              url: '/pages/result/result?type=' + type,
            })
          }
        })
      } else if (res.code == 204) {
        wx.navigateTo({
          url: '/pages/result/result?type=' + 1,
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    }))
  },

  genRandom(length) {
    const charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    let randomString = '';
    for (let i = 0; i < length; i++) {
      const randomIndex = Math.floor(Math.random() * charSet.length);
      randomString += charSet.charAt(randomIndex);
    }
    return randomString;
  },

  // 快递数量数字输入框
  handleMinus() {
    const itemNum = this.data.itemNum;
    if (itemNum > 0) {
      this.setData({
        itemNum: itemNum - 1,
      });
    }
  },
  handlePlus() {
    const itemNum = this.data.itemNum;
    this.setData({
      itemNum: itemNum + 1,
    });
  },
  //取件数量输入
  handleInput(e) {
    const value = e.detail.value;
    if (value >= 0) {
      this.setData({
        itemNum: value,
      });
    }
    //更新购物车取件数量
    let items = this.data.items
    items.forEach(item => {
      item.itemNum = itemNum
    })
  },
  // 加急配送单选
  radioChange: function (e) {
    let tag = e.detail.value
    this.setData({
      tag: tag
    })
  },
  //送达方式选中
  wayOpt: function (e) {
    let item = e.currentTarget.dataset.item
    //入户密码
    if (item.id == 3) {
      this.setData({
        intoHomePwd: true,
      });
      return
    }
    //预约时间
    if (item.id == 4) {
      this.setData({
        makeTime: true
      })
      return
    }
    //其他
    this.setData({
      delvMode: item.id
    })
  },
  //送达方式交互
  pwdClosed(e) { // 入户密码弹窗
    let ways = this.data.ways
    ways.forEach(item => {
      if (item.id == 3) {
        item.value = this.data.intoPwd
      }
    })

    this.setData({
      intoHomePwd: false,
      delvMode: 3,
      ways: ways
    });
  },
  pwdClos() { // 关闭密码输入弹窗
    this.setData({
      intoHomePwd: false,
    });
  },
  makeTime() { // 时间预约弹窗
    let ways = this.data.ways
    ways.forEach(item => {
      if (item.id == 4) {
        item.value = this.data.date + " " + this.data.time
      }
    })

    this.setData({
      makeTime: false,
      delvMode: 4,
      ways: ways
    });
  },
  TimeClos() { // 关闭时间预约弹窗
    this.setData({
      makeTime: false,
    });
  },

  /**
   * 下单弹窗转换
   * @param {*} e 
   */
  payToggle: function (e) {
    let val = e.currentTarget.dataset.val == 1 ? true : false
    this.setData({
      payDisplay: val
    })

  },


  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var currTime = new Date();
    const startDate = formatDate(currTime)
    const startTime = afterMinute(currTime, 10)
    const endDate = afterDay(currTime, 10)

    const id = options.id
    this.setData({
      startDate: startDate,
      endDate: endDate,
      startTime: startTime,
      id: id
    })
    //加载商品
    product.detail({
      id: id
    }, res => {
      if (res.code == 200) {
        this.setData({
          detail: res.data,
          spec: res.data.spec
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    })

  },

  // 用户地址选择点击参数事件
  parameterTap: function (e) { //e是获取e.currentTarget.dataset.id所以是必备的，跟前端的data-id获取的方式差不多
    let item = e.currentTarget.dataset.item
    this.setData({
      addrId: item.id
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady() {
    msg = this.selectComponent("#msg")
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow() {
    //用户地址选择
    userAddr.list(null, res => {
      if (res.code == 200) {
        if (!res.data) {
          return
        }
        this.setData({
          uAddrs: res.data
        })
        res.data.forEach(item => {
          if (item.isFirst == 1) {
            this.setData({
              addrId: item.id
            })
          }
        })
      } else {
        msg && msg.show({
          text: res.msg
        })
      }
    })

    //获取用户消费券列表
    this.getUserCouponList();
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage() {

  },
})